-- ABS 周卡

local Config = require("Config")
local AbsActExcel = require("excel.absAct")
local Lang = require("common.Lang")
local Util = require("common.Util")
local Msg = require("core.Msg")
local AbsActDefine = require("absAct.AbsActDefine")
local ObjHuman = require("core.ObjHuman")
local Broadcast = require("broadcast.Broadcast")
local MangHeLogic = require("absAct.MangHeLogic")
local MailExcel = require("excel.mail")
local MailManager = require("mail.MailManager")
local CommonDB = require("common.CommonDB")
local AbsActLogic = require("absAct.AbsActLogic")
local HeroGrid = require("hero.HeroGrid")
local DrawCardLogic = require("drawCard.DrawCardLogic")
local Log = require("common.Log")
local HeroBook = require("hero.HeroBook")
local HeroExcel = require("excel.hero")
local HeroLogic = require("hero.HeroLogic")
local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
local Grid = require("bag.Grid")
local BuyLogic = require("topup.BuyLogic")
local BuyExcel = require("excel.buy")
local TopupLogic = require("topup.TopupLogic")
local MailExcel = require("excel.mail")
local MailManager = require("mail.MailManager")
local BagLogic = require("bag.BagLogic")

DAY_CNT = 7

local function initDB(human, id, actId)
    if not human.db.absAct[id] then return end
    human.db.absAct[id][actId] = { dayCnt = DAY_CNT }
end

function isOpen(human, YYInfo, funcConfig)
    return AbsActLogic.isStarted(human, funcConfig.funcID)
end

function isActive(human, YYInfo, funcConfig)
    return not isOpen(human, YYInfo, funcConfig)
end

function isRed(human, YYInfo, funcConfig)
    return false
end

function getAndSendMsg(human, id, config)
    local msgRet = Msg.gc.GC_ABS_WEEK_LYCARD_QUERY
    msgRet.leftTime = 0
    msgRet.actId = id

    local actId = config.actId
    local weeklyCardConfig = AbsActExcel.absWeeklyCard
    if not weeklyCardConfig then return end

    local buyItemConfig = BuyExcel.libao[TopupLogic.TOPUP_LIBAO_ID2]
    if not buyItemConfig then return end

    local absAct = human.db.absAct[id]
    msgRet.isActive = absAct and absAct[config.actId] and 1 or 0

    local len = 0
    for k, item in ipairs(weeklyCardConfig) do
        len = len + 1
        if len > #msgRet.weekLyCard then
            break
        end

        local net = msgRet.weekLyCard[len]

        net.id = k
        net.items[0] = #item[actId]
        for i = 1, #item[actId] do
            Grid.makeItem(net.items[i], item[actId][i][1], item[actId][i][2])
        end
    end
    msgRet.weekLyCard[0] = len

    msgRet.buyItem.item[0] = #buyItemConfig.reward
    for i = 1, #buyItemConfig.reward do
        Grid.makeItem(msgRet.buyItem.item[i], buyItemConfig.reward[i][1], buyItemConfig.reward[i][2])
    end

    msgRet.buyItem.cnt = isActive and 1 or 0
    msgRet.buyItem.id = TopupLogic.TOPUP_LIBAO_ID2
    msgRet.buyItem.maxCnt = buyItemConfig.cnt
    msgRet.buyItem.icon = buyItemConfig.icon or 0
    msgRet.buyItem.name = buyItemConfig.name or ""
    BuyLogic.fontBuyItem(human, msgRet.buyItem.buyMsg[1], buyItemConfig.buyID)
    msgRet.buyItem.buyMsg[0] = 1
    msgRet.buyItem.needItem[0] = 0
    
    Msg.send(msgRet, human.fd)
end

function updateDaily(human, id, findActId)
    local config = AbsActExcel.absActivity[id]
    if not config then return end

    -- 有无激活记录
    local absAct = human.db.absAct[id]
    if not absAct then return end

    -- 发放奖励
    local clean = false
    for actId, v in pairs(absAct) do
        -- 是否只发放当期奖励
        local bSend = false
        if findActId == nil or
            findActId == actId then
            bSend = true
        end

        if type(v) == "table" and v.dayCnt and v.dayCnt > 0 and bSend then

            v.dayCnt = v.dayCnt - 1

            local dayIndex = DAY_CNT - v.dayCnt
            local weeklyCardConfig = AbsActExcel.absWeeklyCard[dayIndex]
            if weeklyCardConfig then
                -- 减去一天
                local mailId = config.param[1]
                local mailConfig = MailExcel.mail[mailId]
                local title = mailConfig.title
                local senderName = mailConfig.senderName
                local content = Util.format(mailConfig.content, DAY_CNT, DAY_CNT - v.dayCnt) 
                MailManager.add(MailManager.SYSTEM, human.db._id, title, content, weeklyCardConfig[actId], senderName)
            end
            
            clean = true
            -- 有数据就 跳出重置流程
            if v.dayCnt > 0 then
                clean = false
            else
                -- 小于0的 清除掉
                human.db.absAct[id][actId] = nil
            end
        end
    end

    if clean and findActId == nil then
        human.db.absAct[id] = { endTime = config.realEndTime }
    end
end

-- 礼包激活
function absWeeklyCard(human, id, buyConf, isFirst, cnt)
    local state, endTime, starTime = AbsActLogic.isStarted(human, id)
    if not state then return end

    local config = AbsActExcel.absActivity[id]
    if not config then return end

    local buyItemConfig = BuyExcel.libao[TopupLogic.TOPUP_LIBAO_ID2]
    if not buyItemConfig then return end

    AbsActLogic.checkAbsActClean(human, id)

    -- 是否已经激活
    local absAct = human.db.absAct[id][config.actId]
    if absAct ~= nil then return end

    -- 激活
    initDB(human, id, config.actId)

    -- 给礼包道具
    BagLogic.addItemList(human, buyItemConfig.reward, "abs_weeklyCard")

    -- 发送一天道具
    updateDaily(human, id, config.actId)

    Broadcast.sendErr(human, Lang.ITEM_BUY_SUCCESS)
    getAndSendMsg(human, id, config)
end